38 #define MAXPACKETRATEHZ 40 39 #define RATERESOLUTION 1000 60 uint16_t iBytesToCopy)
65 for (i = 0; i < iBytesToCopy; i++)
71 pDest[(*pIndex)++] = 0x7D;
72 pDest[(*pIndex)++] = 0x5E;
77 pDest[(*pIndex)++] = 0x7D;
78 pDest[(*pIndex)++] = 0x5D;
83 pDest[(*pIndex)++] = pSource[i];
93 int16_t scratch16 = 0;
95 for (i=0; i<numZeros; i++) {
106 uint16_t *isystick) {
111 *iPhi = (int16_t) (10.0F * data->
fPhi);
112 *iThe = (int16_t) (10.0F * data->
fThe);
113 *iRho = (int16_t) (10.0F * data->
fRho);
114 *isystick = (uint16_t) (data->
systick / 20);
121 static int32 iThrottle = 0;
143 #pragma diag_suppress=Pe177,Pe550 // Suppress "never used" and "set but never used" 148 static uint32_t iTimeStamp = 0;
161 uint8_t AngularVelocityPacketOn,
164 int8_t AccelCalPacketOn;
165 static uint8_t iPacketNumber = 0;
170 #if (MAXPACKETRATEHZ < FUSION_HZ) 172 if (skip_packet)
return;
208 sUARTOutputBuffer[iIndex++] = 0x7E;
219 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp, 4);
224 switch (quaternionPacketType)
232 scratch32 = (sfg->Accel.iGc[
CHX] * 8192) / sfg->Accel.iCountsPerg;
233 if (scratch32 > 32767) scratch32 = 32767;
234 if (scratch32 < -32768) scratch32 = -32768;
235 scratch16 = (int16_t) (scratch32);
236 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
238 scratch32 = (sfg->Accel.iGc[
CHY] * 8192) / sfg->Accel.iCountsPerg;
239 if (scratch32 > 32767) scratch32 = 32767;
240 if (scratch32 < -32768) scratch32 = -32768;
241 scratch16 = (int16_t) (scratch32);
242 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
244 scratch32 = (sfg->Accel.iGc[
CHZ] * 8192) / sfg->Accel.iCountsPerg;
245 if (scratch32 > 32767) scratch32 = 32767;
246 if (scratch32 < -32768) scratch32 = -32768;
247 scratch16 = (int16_t) (scratch32);
248 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
250 #endif // F_USING_ACCEL 265 switch (quaternionPacketType)
273 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
275 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
277 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
298 switch (quaternionPacketType)
306 scratch16 = (int16_t) ((sfg->Gyro.iYs[
CHX] * 20) / sfg->Gyro.iCountsPerDegPerSec);
307 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
308 scratch16 = (int16_t) ((sfg->Gyro.iYs[
CHY] * 20) / sfg->Gyro.iCountsPerDegPerSec);
309 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
310 scratch16 = (int16_t) ((sfg->Gyro.iYs[
CHZ] * 20) / sfg->Gyro.iCountsPerDegPerSec);
311 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
331 fq.
q1 = fq.
q2 = fq.
q3 = 0.0F;
333 iOmega[
CHX] = iOmega[
CHY] = iOmega[
CHZ] = 0;
334 iPhi = iThe = iRho = iDelta = 0;
349 switch (quaternionPacketType)
356 readCommon((
SV_ptr)&sfg->SV_3DOF_G_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
365 readCommon((
SV_ptr)&sfg->SV_3DOF_B_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
374 readCommon((
SV_ptr)&sfg->SV_3DOF_Y_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
383 iDelta = (int16_t) (10.0F * sfg->SV_6DOF_GB_BASIC.fLPDelta);
384 readCommon((
SV_ptr)&sfg->SV_6DOF_GB_BASIC, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
393 readCommon((
SV_ptr)&sfg->SV_6DOF_GY_KALMAN, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
397 #if F_9DOF_GBY_KALMAN 402 iDelta = (int16_t) (10.0F * sfg->SV_9DOF_GBY_KALMAN.fDeltaPl);
403 readCommon((
SV_ptr)&sfg->SV_9DOF_GBY_KALMAN, &fq, &iPhi, &iThe, &iRho, iOmega, &isystick);
413 scratch16 = (int16_t) (fq.
q0 * 30000.0F);
414 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
415 scratch16 = (int16_t) (fq.
q1 * 30000.0F);
416 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
417 scratch16 = (int16_t) (fq.
q2 * 30000.0F);
418 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
419 scratch16 = (int16_t) (fq.
q3 * 30000.0F);
420 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
423 #if THISCOORDSYSTEM == ANDROID 426 #elif THISCOORDSYSTEM == WIN8 429 #endif // THISCOORDSYSTEM 435 tmpuint8_t = ((THIS_SHIELD & 0x07) << 5) | (THIS_BOARD & 0x1F);
439 sUARTOutputBuffer[iIndex++] = 0x7E;
448 sUARTOutputBuffer[iIndex++] = 0x7E;
460 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
463 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &isystick, 2);
466 sUARTOutputBuffer[iIndex++] = 0x7E;
473 if (AngularVelocityPacketOn)
476 sUARTOutputBuffer[iIndex++] = 0x7E;
487 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp, 4);
495 sUARTOutputBuffer[iIndex++] = 0x7E;
505 sUARTOutputBuffer[iIndex++] = 0x7E;
516 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp, 4);
524 sUARTOutputBuffer[iIndex++] = 0x7E;
537 sUARTOutputBuffer[iIndex++] = 0x7E;
548 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &iTimeStamp,
552 scratch32 = (int32_t) (sfg->SV_1DOF_P_BASIC.fLPH * 1000.0F);
553 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch32, 4);
556 scratch16 = (int16_t) (sfg->SV_1DOF_P_BASIC.fLPT * 100.0F);
557 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
560 sUARTOutputBuffer[iIndex++] = 0x7E;
571 static int16_t MagneticPacketID = 0;
575 sUARTOutputBuffer[iIndex++] = 0x7E;
594 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
597 scratch16 = (int16_t) (sfg->
MagCal.
fB * 10.0F);
598 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
601 k = MagneticPacketID - 10;
610 if ((MagneticPacketID >= 10) && (sfg->
MagBuffer.
index[i][j] == -1))
613 scratch16 = -MagneticPacketID;
614 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
619 scratch16 = MagneticPacketID;
620 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
626 switch (MagneticPacketID)
631 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
635 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
639 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
644 scratch16 = (int16_t) (sfg->
MagCal.
fV[
CHX] * 10.0F);
645 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
646 scratch16 = (int16_t) (sfg->
MagCal.
fV[
CHY] * 10.0F);
647 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
648 scratch16 = (int16_t) (sfg->
MagCal.
fV[
CHZ] * 10.0F);
649 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
655 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
657 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
659 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
664 scratch16 = (int16_t) (sfg->
MagCal.
finvW[CHX][CHY] * 1000.0F);
665 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
666 scratch16 = (int16_t) (sfg->
MagCal.
finvW[CHX][CHZ] * 1000.0F);
667 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
668 scratch16 = (int16_t) (sfg->
MagCal.
finvW[CHY][CHZ] * 1000.0F);
669 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
695 if (MagneticPacketID >= (10 + MAGBUFFSIZEX *
MAGBUFFSIZEY))
696 MagneticPacketID = 0;
699 sUARTOutputBuffer[iIndex++] = 0x7E;
712 kalman = six_axis_kalman;
714 #if F_9DOF_GBY_KALMAN 716 kalman = kalman | nine_axis_kalman;
718 #if F_6DOF_GY_KALMAN || F_9DOF_GBY_KALMAN 721 if ((quaternionPacketType ==
Q6AG) || (quaternionPacketType ==
Q9))
724 sUARTOutputBuffer[iIndex++] = 0x7E;
737 for (i =
CHX; i <=
CHZ; i++)
740 if (six_axis_kalman) scratch16 = (int16_t) (sfg->SV_6DOF_GY_KALMAN.fZErr[i] * 30000.0F);
742 #if F_9DOF_GBY_KALMAN 743 if (nine_axis_kalman) scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fZErr[i] * 30000.0F);
745 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16,2);
751 for (i =
CHX; i <=
CHZ; i++)
754 if (six_axis_kalman) scratch16 = (int16_t) (sfg->SV_6DOF_GY_KALMAN.fqgErrPl[i] * 30000.0F);
756 #if F_9DOF_GBY_KALMAN 757 if (nine_axis_kalman) scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fqgErrPl[i] * 30000.0F);
759 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16,2);
765 for (i =
CHX; i <=
CHZ; i++)
768 if (six_axis_kalman) scratch16 = 0;
770 #if F_9DOF_GBY_KALMAN 771 if (nine_axis_kalman) scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fZErr[i + 3] * 30000.0F);
773 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
779 for (i =
CHX; i <=
CHZ; i++)
782 if (six_axis_kalman) scratch16 = 0;
784 #if F_9DOF_GBY_KALMAN 785 if (nine_axis_kalman) scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fqmErrPl[i] * 30000.0F);
787 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
793 for (i =
CHX; i <=
CHZ; i++)
796 if (six_axis_kalman) scratch16 = (int16_t) (sfg->SV_6DOF_GY_KALMAN.fbPl[i] * 1000.0F);
798 #if F_9DOF_GBY_KALMAN 799 if (nine_axis_kalman) scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fbPl[i] * 1000.0F);
801 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
806 #if F_9DOF_GBY_KALMAN 807 if (nine_axis_kalman) scratch16 = (int16_t) (sfg->SV_9DOF_GBY_KALMAN.fDeltaPl * 100.0F);
809 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
814 for (i =
CHX; i <=
CHZ; i++)
819 if (six_axis_kalman) ftmp = sfg->SV_6DOF_GY_KALMAN.fAccGl[i] * 8192.0F;
821 #if F_9DOF_GBY_KALMAN 822 if (nine_axis_kalman) ftmp = sfg->SV_9DOF_GBY_KALMAN.fAccGl[i] * 8192.0F;
826 if (ftmp > 32767.0F) scratch16 = 32767;
827 else if (ftmp < -32768.0F) scratch16 = -32768;
828 else scratch16 = (int16_t) ftmp;
829 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
835 for (i =
CHX; i <=
CHZ; i++)
839 #if F_9DOF_GBY_KALMAN 840 if (nine_axis_kalman) ftmp = sfg->SV_9DOF_GBY_KALMAN.fDisGl[i] * 100.0F;
844 if (ftmp > 32767.0F) scratch16 = 32767;
845 else if (ftmp < -32768.0F) scratch16 = -32768;
846 else scratch16 = (int16_t) ftmp;
847 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
851 sUARTOutputBuffer[iIndex++] = 0x7E;
862 if (AccelCalPacketOn != -1)
865 sUARTOutputBuffer[iIndex++] = 0x7E;
878 (uint8_t *) &(AccelCalPacketOn), 1);
881 if ((AccelCalPacketOn >= 0) &&
884 scratch16 = (int16_t) (sfg->AccelBuffer.fGsStored[AccelCalPacketOn][
CHX] * 8192.0F);
885 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
886 scratch16 = (int16_t) (sfg->AccelBuffer.fGsStored[AccelCalPacketOn][
CHY] * 8192.0F);
887 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
888 scratch16 = (int16_t) (sfg->AccelBuffer.fGsStored[AccelCalPacketOn][
CHZ] * 8192.0F);
889 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
898 scratch16 = (int16_t) (sfg->AccelCal.fV[
CHX] * 32768.0F);
899 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
900 scratch16 = (int16_t) (sfg->AccelCal.fV[
CHY] * 32768.0F);
901 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
902 scratch16 = (int16_t) (sfg->AccelCal.fV[
CHZ] * 32768.0F);
903 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
906 scratch16 = (int16_t) ((sfg->AccelCal.finvW[
CHX][
CHX] - 1.0F) * 10000.0F);
907 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
908 scratch16 = (int16_t) ((sfg->AccelCal.finvW[
CHY][
CHY] - 1.0F) * 10000.0F);
909 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
910 scratch16 = (int16_t) ((sfg->AccelCal.finvW[
CHZ][
CHZ] - 1.0F) * 10000.0F);
911 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
914 scratch16 = (int16_t) (sfg->AccelCal.finvW[
CHX][
CHY] * 10000.0F);
915 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
916 scratch16 = (int16_t) (sfg->AccelCal.finvW[
CHX][
CHZ] * 10000.0F);
917 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
918 scratch16 = (int16_t) (sfg->AccelCal.finvW[CHY][CHZ] * 10000.0F);
919 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
922 scratch16 = (int16_t) (sfg->AccelCal.fR0[
CHX][
CHX] * 10000.0F);
923 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
924 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHY][CHY] * 10000.0F);
925 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
926 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHZ][CHZ] * 10000.0F);
927 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
930 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHX][CHY] * 10000.0F);
931 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
932 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHX][CHZ] * 10000.0F);
933 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
934 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHY][CHX] * 10000.0F);
935 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
936 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHY][CHZ] * 10000.0F);
937 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
938 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHZ][CHX] * 10000.0F);
939 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
940 scratch16 = (int16_t) (sfg->AccelCal.fR0[CHZ][CHY] * 10000.0F);
941 sBufAppendItem(sUARTOutputBuffer, &iIndex, (uint8_t *) &scratch16, 2);
944 sUARTOutputBuffer[iIndex++] = 0x7E;
949 #endif // F_USING_ACCEL enum quaternion quaternion_type
the quaternion type to be transmitted
Quaternion derived from full 9-axis sensor fusion.
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (12x24 equals 288 elements)
#define F_USING_GYRO
nominally 0x0004 if a gyro is to be used, 0x0000 otherwise
#define CHY
Used to access Y-channel entries in various data data structures.
void readCommon(SV_ptr data, Quaternion *fq, int16_t *iPhi, int16_t *iThe, int16_t *iRho, int16_t iOmega[], uint16_t *isystick)
Quaternion fq
orientation quaternion
uint32_t iFlags
a bit-field of sensors and algorithms used
ApplyPerturbation function used to analyze dynamic performance.
volatile uint8_t AltPacketOn
flag to enable altitude packet
Quaternion derived from 3-axis mag only (auto compass algorithm)
MagCalibration MagCal
mag cal storage
The top level fusion structure.
volatile int8_t AccelCalPacketOn
variable used to coordinate accelerometer calibration
float fOmega[3]
average angular velocity (deg/s)
float q3
z vector component
int16_t iMagBufferCount
number of magnetometer readings
Quaternion derived from 3-axis gyro only (rotation)
int16_t iCountsPeruT
counts per uT
Quaternion derived from 3-axis accel + 3 axis mag (eCompass)
Quaternion derived from 3-axis accel + 3-axis gyro (gaming)
uint16_t throttle()
(OVERSAMPLE_RATIO * MAXPACKETRATEHZ) / SENSORFS
struct ControlSubsystem * pControlSubsystem
MagSensor Mag
magnetometer storage
quaternion structure definition
#define F_1DOF_P_BASIC
1DOF pressure (altitude) and temperature algorithm selector - 0x0100 to include, 0x0000 otherwise ...
#define F_9DOF_GBY_KALMAN
void sBufAppendItem(uint8_t *pDest, uint16_t *pIndex, uint8_t *pSource, uint16_t iBytesToCopy)
Utility function used to place data in output buffer about to be transmitted via UART.
float finvW[3][3]
current inverse soft iron matrix
#define THISBUILD
define build number sent in debug packet for display purposes only
float fV[3]
current hard iron offset x, y, z, (uT)
#define F_6DOF_GY_KALMAN
6DOF accel and gyro (Kalman) algorithm selector - 0x2000 to include, 0x0000 otherwise ...
The sensor_fusion.h file implements the top level programming interface.
#define F_3DOF_G_BASIC
3DOF accel tilt (accel) algorithm selector - 0x0200 to include, 0x0000 otherwise
uint8_t sUARTOutputBuffer[256]
main output buffer defined in control.c
volatile uint8_t DebugPacketOn
flag to enable debug packet
void CreateAndSendPackets(SensorFusionGlobals *sfg, uint8_t *sUARTOutputBuffer)
Called once per fusion cycle to stream information required by the NXP Sensor Fusion Toolbox...
#define MAX_ACCEL_CAL_ORIENTATIONS
number of stored precision accelerometer measurements
int16_t iBc[3]
averaged calibrated measurement (counts)
#define CHX
Used to access X-channel entries in various data data structures.
float fFitErrorpc
current fit error %
MagBuffer MagBuffer
mag cal constellation points
writePort_t * write
low level function to write a char buffer to the serial stream
volatile uint8_t RPCPacketOn
flag to enable roll, pitch, compass packet
Quaternion derived from 3-axis accel (tilt)
#define F_3DOF_Y_BASIC
3DOF gyro integration algorithm selector - 0x0800 to include, 0x0000 otherwise
#define F_6DOF_GB_BASIC
6DOF accel and mag eCompass algorithm selector - 0x1000 to include, 0x0000 otherwise ...
#define FUSION_HZ
(int) actual rate of fusion algorithm execution and sensor FIFO reads
Defines control sub-system.
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices
void sBufAppendZeros(uint8_t *pDest, uint16_t *pIndex, uint16_t numZeros)
float fB
current geomagnetic field magnitude (uT)
#define F_USING_ACCEL
nominally 0x0001 if an accelerometer is to be used, 0x0000 otherwise
SensorFusionGlobals sfg
This is the primary sensor fusion data structure.
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (12x24 equals 288 elements)
float q2
y vector component
#define F_3DOF_B_BASIC
3DOF mag eCompass (vehicle/mag) algorithm selector - 0x0400 to include, 0x0000 otherwise ...
int32_t systick
systick timer;
Excluding SV_1DOF_P_BASIC, Any of the SV_ fusion structures above could be cast to type SV_COMMON for...
float q1
x vector component
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings
volatile quaternion_type QuaternionPacketType
quaternion type transmitted over UART
volatile uint8_t AngularVelocityPacketOn
flag to enable angular velocity packet